#ifndef VARIABLES_H
#define VARIABLES_H

#include <QHash>

#include "value.h"

class Expression;

/**
*	Stores the variables in a hash map and make them available 
*	@author Aleix Pol <aleixpol@gmail.com>
*/

class Variables : public QHash<QString, Object*>
{
public:
    //Creates an empty variable hash table with the usual constants
    Variables();

    //Copy constructor, copies the old one, a bit heavy, be careful.
    Variables(const Variables& v);

    // Destroys the object
    ~Variables();

    //Modifies the value of the variable called @p name, and if didn't exist, a @p name variable is created with an @p o value.
    void modify(const QString& name, const Object* o);

    //Modifies the value of the variable called @p name, and if didn't exist, a @p name variable is created with an @p e expression.
    void modify(const QString& name, const Expression& o);

    //The same as the last one but having @p d as a value for @p name.
    void modify(const QString& name, const double& d);

    /*
        If the variable @p name didn't exist it takes @p o value, if not @p name variable takes
                @p o value until it is destroyed, when it is going to recover the previous value.
    */
    void stack(const QString& name, const Object* o);
    void stack(const QString& name, double n);

     // The @p orig named variable will be called @p dest , then @p orig will be deleted.
    bool rename(const QString& orig, const QString& dest);

    //The variable @p name will no longer exist.
    bool destroy(const QString& name);
    const QSet<QString> & functions() const;
private:
    QSet<QString> m_functions;
};

#endif
